package com.skh.array;

import java.util.Arrays;

/**
 * @Author: skh
 * @Date: 2018/8/23 15:29
 * @Description: 合并两个有序数组
 */
public class MergeSortedArray {

    /*
    给定两个有序整数数组 nums1 和 nums2，将 nums2 合并到 nums1 中，使得 num1 成为一个有序数组。

    说明:

    初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
    你可以假设 nums1 有足够的空间（空间大小大于或等于 m + n）来保存 nums2 中的元素。
    示例:

    输入:
    nums1 = [1,2,3,0,0,0], m = 3
    nums2 = [2,5,6],       n = 3

    输出: [1,2,2,3,5,6]
     */


    public void merge(int[] nums1, int m, int[] nums2, int n) {

        int j = 0;
        for (int i = 0; i < nums1.length; i++) {
            if (i < m) {
                nums1[i] = nums1[i];
            } else {
                nums1[i] = nums2[j++];
            }
        }

        Arrays.sort(nums1);

    }

    /*
    末尾填充法
    复杂度
    O(M+N) 时间 O(1) 空间

    思路
    从后往前填充即可

    注意
    先当两个数组都有元素的时候填充大的到末尾，如果有一个数组的数用完了，说明剩下的那个数组的所有数都小于当前填充的位置：

    如果是第一个数组用完了，说明剩下的(最小的那些)全是数组2，把数组2填充进去就好了

    如果是第二个数组用完了，说明剩下的全是数组1，不用填充了，他们已经在了
     */
    public void merge1(int[] nums1, int m, int[] nums2, int n) {
        int i = m - 1;
        int j = n - 1;
        int k = m + n - 1;

        while (i >= 0 && j >= 0) {
            nums1[k--] = nums1[i] > nums2[j] ? nums1[i--] : nums2[j--];
        }

        while (j >= 0) {
            nums1[k--] = nums2[j--];
        }


    }


    public static void main(String[] args) {
        MergeSortedArray mergeSortedArray = new MergeSortedArray();
        int[] num1 = {1, 2, 0, 0, 0};
        int[] num2 = {2, 5, 6};
        mergeSortedArray.merge(num1, 2, num2, 3);
        System.out.println("num1 = " + Arrays.toString(num1));
    }

}
